package com.lthlearn.util;

import com.lthlearn.pojo.User;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

/**
 * @author: 2942733239@qq.com
 * @date: 2024/11/5 13:59
 * @description: com.lthlearn.util
 * @version: 1.0
 */
public class JWTUtils {

    /**
     * 设置过期时间,一周
     */
    private static final long EXPIRE = 7 * 24 * 60 * 60 * 1000;
    // private static final long EXPIRE = 2 * 60 * 1000;

    /**
     * 设置秘钥
     * 盐的作用 - 一定是存在服务器端 - 定期进行更新
     */
    // 盐值
    private static final String SECRET = "success";

    /**
     * 令牌前缀
     */
    private static final String TOKEN_PREFIX = "aistar";

    /**
     * 令牌主题
     */
    private static final String SUBJECT = "login";

    /**
     * 根据用户信息来生成令牌(token)
     *
     * @param user
     * @return
     */
    public static String geneJsonWebToken(User user) {
        // 头部省略不写了
        //        {
        //            "typ": "JWT"
        //            "alg": "HS256"
        //        }
        String token = Jwts.builder().setSubject(SUBJECT)

                // 自定义的载荷部分
                // 载荷 - 有效信息 - 登录用户的有效信息,是为了校验用户是否登录的信息
                .claim("id", user.getUserId())
                .claim("username", user.getUsername())
                //.claim("email",user.getEmail())
                // 颁布时间
                .setIssuedAt(new Date())
                // 过期时间
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))

                // 生成签名 - token值
                // HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
                // 签名 - token
                .signWith(SignatureAlgorithm.HS256, SECRET).compact();
        // 前缀都是为了安全
        token = TOKEN_PREFIX + token;
        return token;
    }

    /**
     * 校验token的方法
     *
     * @param token
     * @return
     */
    public static Claims checkJWT(String token) {
        try {
            final Claims claims = Jwts.parser().setSigningKey(SECRET)
                    .parseClaimsJws(token.replace(TOKEN_PREFIX, "")).getBody();

            return claims;

        } catch (Exception e) {
            return null;
        }
    }


}
